package com.shujia.day05;

import java.util.Random;

public class Demo02CodeType {
    public static void main(String[] args) {
        /*
        在Java中，使用{}括起来的代码被称为代码块，根据其位置和声明的不同，可以分为局部代码块，构造代码块，静态代码块，同步代码块(多线程讲解)。
            局部代码块
            在方法中出现；限定变量生命周期，及早释放，提高内存利用率
            构造代码块
            在类中方法外出现；多个构造方法方法中相同的代码存放到一起，每次调用构造都执行，并且在构造方法前执行
            静态代码块 在类中方法外出现，加了static修饰
            在类中方法外出现，并加上static修饰；用于给类进行初始化，在加载的时候就执行，并且值执行一次。

         */

        useCodeRound();

        Student student = new Student("盛宇豪", 18);
        student.show();
        Student student1 = new Student("彭飞", 18);
        student1.show();
        Student student2 = new Student("袁枫", 18);
        student2.show();
//        Student student = new Student("盛宇豪", 18);;


    }

    public static void useCodeRound() {
        int i = 10;
        // TODO 局部代码块: 在方法中使用 {} 定义 => 其作用是用于限制变量的生命周期
        {
            int var = 1;
            System.out.println(var);
            System.out.println(i);
        }
//        System.out.println(var);  // TODO 局部代码块中定义的变量其作用范围仅在当前{}中 {}执行完成，变量消失
        System.out.println(i);  //


    }
}

class Student {
    private static String flag ;  // flag标记 当出现在Student中用于标记当前类是一个人类
    /*
        TODO 静态代码块：
            定义：在类中 方法外 使用 static修饰 {}
            作用：在类被加载时，用于创建对象之前，静态代码块会被执行
            应用：对静态变量进行做初始化 => 对类做初始化
     */
    static {
        System.out.println("人类被上帝所赋予了...");
        flag = "人类";
    }


    private String name;
    private int age;
    private String skill;

    /*
        TODO 构造代码块：
            定义：在类中 方法外使用 {} 定义
            作用：在对象每次被构建时，都会被执行, 并且构造代码块会先于构造方法执行
            应用场景: 对于对象构建时，进行做初始化操作 => 对对象进行初始化
     */
    {
        System.out.println("一个新生命产生了,上帝赋予了天赋");
        int nextInt = new Random().nextInt(3);// 0 1 2
        if (nextInt == 0){
            this.skill = "高智商";
        }else if (nextInt == 1){
            this.skill = "高情商";
        }else {
            this.skill = "高财商";
        }
    }

    public Student(String name, int age) {
        System.out.println("Student构造方法被调用了...");
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    public void show() {
        System.out.println(flag+":姓名：" + name + "\t 年龄:" + age + "\t 天赋：" + skill );
    }
}